# encoding:utf-8
'''
@author : xaing
@time : 2019/4/10 17:22
@地址 : 广州
@作用 : pyqt5 相关
@结果 :
'''


from PyQt5.QtGui import QIcon, QPalette, QBrush, QPixmap, QCursor
from PyQt5.QtWidgets import QPushButton, QLabel, QLineEdit, QAction, QMessageBox, QFileDialog, QComboBox
from PyQt5.QtCore import Qt

import os

from version1 import common
from version1 import fileUtils as file




def mouseAround(QMainWindow):
    '''
    鼠标变成 转圈的样式
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类
    :return:
    '''
    QMainWindow.setCursor(Qt.WaitCursor)

def mouseDefault(QMainWindow):
    '''
    鼠标恢复为默认状态
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类
    :return:
    '''
    QMainWindow.setCursor(Qt.ArrowCursor)


def getMainWindows(QMainWindow, winWide, winHeight, winTitle, winIcon, winTip, initX, initY, isStretch):
    '''
    得到一个主窗口
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类
    :param winWide: 主窗口的宽度 必填
    :param winHeight: 主窗口的高度 必填
    :param winTitle: 主窗口标题
    :param winIcon: 图片的路径
    :param winTip: 鼠标放置一会就会出现的提示信息
    :param initX: 主窗口在桌面显示的X轴位置 必填
    :param initY: 主窗口在桌面显示的Y轴位置 必填
    :param isStretch: 窗口是否可以拉伸 true 可以 false 不可以
    :return:
    '''
    if common.checkNull(winWide):
        raise Exception("窗口的宽度 不能为空")

    if common.checkNull(winHeight):
        raise Exception("窗口的高度 不能为空")

    if common.checkNull(initX):
        raise Exception("窗口初始位置X轴 不能为空")

    if common.checkNull(initY):
        raise Exception("窗口的初始位置Y轴 不能为空")

    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    # 设置窗口的大小 宽  高
    QMainWindow.resize(winWide, winHeight)
    # 设置窗口距离桌面的坐标，即窗口展示的时候在桌面的位置  左右 上下
    QMainWindow.move(initX, initY)

    if winTitle is not None:
        # 窗口标题
        QMainWindow.setWindowTitle(str(winTitle))

    if winIcon is not None:
        # 设置ico图片
        if file.isFileManyCheck(winIcon):
            QMainWindow.setWindowIcon(QIcon(str(winIcon)))
        else:
            raise Exception("图片不能是目录")

    if winTip is not None:
        # 鼠标停放一会出现的提示信息
        QMainWindow.setToolTip(str(winTip))

    if isStretch is False:
        QMainWindow.setFixedSize(winWide, winHeight)


def addBackgroundImg(QMainWindow, imgPath):
    '''
    主窗口添加背景图片
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类
    :param imgPath: 图片的路径
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if imgPath is not None:
        if file.isFileManyCheck(imgPath):
            # 第一种添加背景图的方式
            palette = QPalette()
            palette.setBrush(QPalette.Background, QBrush(QPixmap(str(imgPath))))
            QMainWindow.setPalette(palette)

        else:
            raise Exception("图片不能是目录")

    # 第二种添加背景图的方式
    # window_pale = QPalette()
    # window_pale.setBrush(self.backgroundRole(), QBrush(QPixmap("E:\\kaiFa\\py\\common\\test\\qt\\2.png")))
    # self.setPalette(window_pale)


def getButton(buttonName, QMainWindow, initX, initY, buttonWide, buttonHeight, buttonIcon, buttonTip, QFont, style, event):
    '''
    返回一个按钮对象
    :param buttonName: 按钮上显示的文字，不指定则默认为  “按钮”
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param initX: 必填，按钮相对于主窗口的相对位置，X轴
    :param initY: 必填，按钮相对于主窗口的相对位置 Y轴
    :param buttonWide: 设置按钮的 宽，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则为默认
    :param buttonHeight: 设置按钮的 高，这个会影响窗口中文字的显示,设置过小会导致按钮很小， 不设置则为默认
    :param buttonIcon: 按钮的icon 图片，字符串，可以是相对或绝对图片位置
    :param buttonTip: 当鼠标停放一会展示的提示信息
    :param QFont: 一个字体对象,可以设置字体
    :param event: 事件,这里只会关联鼠标点击事件.传入一个方法名即可,不需要括号
    :param style: 样式。 示例：

    和写css样式差不多，注意，样式会影响到你设置的字体等

    QPushButton{border:none;color:white;}
    QPushButton#left_label{
        border:none;
        border-bottom:1px solid white;
        font-size:18px;
        font-weight:700;
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }
    QPushButton:hover{border-left:4px solid red;font-weight:700;}

    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(initX):
        raise Exception("按钮初始位置X轴 不能为空")

    if common.checkNull(initY):
        raise Exception("按钮的初始位置Y轴 不能为空")

    button = None
    if common.checkNull(buttonName):
        button = QPushButton("按钮", QMainWindow)
    else:
        button = QPushButton(str(buttonName), QMainWindow)

    if buttonIcon is not None:
        button.setIcon(QIcon(str(buttonIcon)))

    if buttonTip is not None:
        button.setToolTip(str(buttonTip))

    if buttonWide is not None and buttonHeight is not None:
        button.resize(buttonWide, buttonHeight)
    else:
        # 给定默认的按钮大小
        button.resize(button.sizeHint())

    if QFont is not None:
        button.setFont(QFont)

    # 按钮相对父元素的位置 左右  上下
    button.move(initX, initY)

    if style is not None:
        button.setStyleSheet(str(style))

    if event is not None:
        button.clicked.connect(event)

    return button


def addText(QMainWindow, initX, initY, content, color, QFont, textWide, textHeight):
    '''
    返回一个文本对象
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param initX: 必填，文本相对于主窗口的相对位置，X轴
    :param initY: 必填，文本相对于主窗口的相对位置 Y轴
    :param content: 必填，要添加的文本
    :param color: 颜色，默认是黑色，常用的是白色 'white'
    :param QFont: 一个字体对象,可以设置字体
    :param textWide: 设置文本的 宽，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则为默认
    :param textHeight: 设置文本的 高，这个会影响窗口中文字的显示,设置过小会导致按钮很小， 不设置则为默认
    :return: 返回一个文本对象
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(initX):
        raise Exception("文本初始位置X轴 不能为空")

    if common.checkNull(initY):
        raise Exception("文本的初始位置Y轴 不能为空")

    if common.checkNull(content):
        raise Exception("要显示的文本 不能为空")

    text = QLabel(QMainWindow)
    # 展示的文字
    text.setText(str(content))

    if color is not None:
        # 文本颜色
        text.setStyleSheet(common.outStr('color:', color))

    if QFont is not None:
        # 文本的字体
        text.setFont(QFont)

    if textWide is not None and textHeight is not None:
        text.resize(textWide, textHeight)
    else:
        text.resize(text.sizeHint())

    text.move(initX, initY)

    return text




def addInput(QMainWindow, initX, initY, inputWide, inputHeight):
    '''
    返回一个输入框对象
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param initX: 必填，输入框 相对于主窗口的相对位置，X轴
    :param initY: 必填，输入框 相对于主窗口的相对位置 Y轴
    :param inputWide: 设置输入框的 宽，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则默认构造一个
    :param inputHeight: 设置输入框的 高，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则默认构造一个
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(initX):
        raise Exception("输入框始位置X轴 不能为空")

    if common.checkNull(initY):
        raise Exception("输入框初始位置Y轴 不能为空")

    input = QLineEdit(QMainWindow)

    if inputWide is not None and inputHeight is not None:
        input.resize(inputWide, inputHeight)
    else:
        input.resize(140, 25)

    input.move(initX, initY)

    return input


def addComboBox(QMainWindow, data, initX, initY, comboboxWide, comboboxHeight, Font, event):
    '''
    返回一个下拉框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param data: 数据，数据是列表 ['Java','C#','PHP']
    :param initX: 必填，输入框 相对于主窗口的相对位置，X轴
    :param initY: 必填，输入框 相对于主窗口的相对位置 Y轴
    :param comboboxWide: 设置下拉框的 宽，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则默认构造一个
    :param inputHeight: 设置下拉框的 高，这个会影响窗口中文字的显示,设置过小会导致按钮很小，不设置则默认构造一个
    :param Font: 一个字体对象,可以设置字体
    :param event: 事件,这里只会关联鼠标点击事件.传入一个方法名即可,不需要括号
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(initX):
        raise Exception("下拉框初始位置X轴 不能为空")

    if common.checkNull(initY):
        raise Exception("下拉框初始位置Y轴 不能为空")

    if data is None:
        raise Exception("下拉框不能为空，请传入数据")

    comboBox = QComboBox(QMainWindow)
    comboBox.addItems(data)
    comboBox.move(initX, initY)

    if comboboxWide is not None and comboboxHeight is not None:
        comboBox.resize(comboboxWide, comboboxHeight)

    if Font is not None:
        comboBox.setFont(Font)

    comboBox.currentIndexChanged.connect(event)
    return comboBox


def addTisPopup(QMainWindow, title, msg):
    '''
    弹出提示框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param title: 提示框的标题，默认叫 提示
    :param msg: 提示的信息文本
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(title):
        title = "提示"

    if common.checkNull(msg):
        raise Exception("提示文本不能为空")

    return QMessageBox.information(QMainWindow, title, msg, QMessageBox.Yes)


def confirmPopup(QMainWindow, title, msg):
    '''
    弹出确认框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param title: 提示框的标题，默认叫 确认框
    :param msg: 确认的信息文本
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(title):
        title = "确认框"

    if common.checkNull(msg):
        raise Exception("确认的文本不能为空")

    return QMessageBox.question(QMainWindow, title, msg, QMessageBox.Yes | QMessageBox.No)


def errorPopup(QMainWindow, title, msg):
    '''
    弹出错误框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param title: 错误框的标题，默认叫 错误
    :param msg: 错误提示的信息文本
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(title):
        title = "错误"

    if common.checkNull(msg):
        raise Exception("错误的提示文本不能为空")

    return QMessageBox.critical(QMainWindow, title, str(msg))


def warningPopup(QMainWindow, title, msg):
    '''
    弹出警告框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param title: 警告框的标题，默认叫 警告
    :param msg: 警告提示的信息文本
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(title):
        title = "警告"

    if common.checkNull(msg):
        raise Exception("警告的提示文本不能为空")

    return QMessageBox.warning(QMainWindow, title, str(msg), QMessageBox.Yes)


def aboutPopup(QMainWindow, title, msg):
    '''
    弹出 关于的信息框
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :param title: 关于框的标题，默认叫 关于
    :param msg: 关于提示的信息文本
    :return:
    '''
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    if common.checkNull(title):
        title = "关于"

    if common.checkNull(msg):
        raise Exception("关于的提示文本不能为空")

    return QMessageBox.about(QMainWindow, title, str(msg))


def winOpenFile(QMainWindow):
    '''
    返回一个弹出框，选择文件
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :return:
    '''
    # 获取当前程序文件位置
    path = os.getcwd()
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    return QFileDialog.getOpenFileName(QMainWindow, "选择文件夹", path)


def winOpenFolder(QMainWindow):
    '''
    返回一个文件夹
    :param QMainWindow: 传入self，调用该代码的时候，必须是一个继承了QMainWindow 的类 必填
    :return:
    '''
    # 获取当前程序文件位置
    path = os.getcwd()
    if QMainWindow is None:
        raise Exception("窗口对象不能为空，否则无法构建相关元素")

    return QFileDialog.getExistingDirectory(QMainWindow, "选择文件夹", path)


